﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

using TouchSocket.Core;
using TouchSocket.Rpc.TouchRpc;
using TouchSocket.Sockets;

namespace TouchRpc_Client
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Init();
            Console.ReadKey();
        }
        private static void Init()
        {
            TcpTouchRpcClient client = new TouchSocketConfig()
            .SetRemoteIPHost("127.0.0.1:7789")
            .SetVerifyToken("File")
            .UsePlugin()
            .ConfigureContainer(a =>
            {
                a.AddConsoleLogger();
                a.AddFileLogger();
            })
            .ConfigurePlugins(a =>
            {
                a.Add<MyPlugin>();
            })
            .BuildWithTcpTouchRpcClient();

            client.Logger.Info("连接成功");

            //Metadata metadata = new Metadata();//传递到服务器的元数据
            //metadata.Add("1", "1");
            //metadata.Add("2", "2");

            //FileOperator fileOperator = new FileOperator()//实例化本次传输的控制器，用于获取传输进度、速度、状态等。
            //{
            //    Flags = TransferFlags.BreakpointResume,//尝试断点续传，使用断点续传时，会验证MD5值
            //    SavePath = $@"Windows.iso",//保存路径
            //    ResourcePath = @"D:\System\Windows.iso",//请求路径
            //    Metadata = metadata//传递到服务器的元数据
            //};

            //fileOperator.Timeout = TimeSpan.FromSeconds(60);//当传输大文件，且启用断点续传时，服务器可能会先计算MD5，而延时响应，所以需要设置超时时间。

            ////此处的作用相当于Timer，定时每秒输出当前的传输进度和速度。
            //LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
            //{
            //    if (fileOperator.Result.ResultCode != ResultCode.Default)
            //    {
            //        loop.Dispose();
            //    }

            //    client.Logger.Info($"进度：{fileOperator.Progress}，速度：{fileOperator.Speed()}");
            //});

            //loopAction.RunAsync();



            ////此方法会阻塞，直到传输结束，也可以使用PullFileAsync
            //IResult result = client.PullFile(fileOperator);

            //client.Logger.Info(result.ToString());



        }
    }
    class MyPlugin : TouchRpcPluginBase<TcpTouchRpcClient>
    {
        protected override void OnFileTransfering(TcpTouchRpcClient client, FileOperationEventArgs e)
        {
            e.IsPermitOperation = true;//运行操作

            //有可能是上传，也有可能是下载
            client.Logger.Info($"有客户端请求传输文件，ID={client.ID}，请求类型={e.TransferType}，请求文件名={e.ResourcePath}");
        }

        protected override void OnFileTransfered(TcpTouchRpcClient client, FileTransferStatusEventArgs e)
        {
            //传输结束，但是不一定成功，需要从e.Result判断状态。
            client.Logger.Info($"客户端传输文件结束，ID={client.ID}，请求类型={e.TransferType}，文件名={e.ResourcePath}，请求状态={e.Result}");
            IResult result = e.Result;

        }

        protected override void OnHandshaked(TcpTouchRpcClient client, VerifyOptionEventArgs e)
        {
            client.Logger.Info($"有客户端成功验证，ID={client.ID}");
        }

        protected override void OnDisconnected(TcpTouchRpcClient client, ClientDisconnectedEventArgs e)
        {
            client.Logger.Info($"有客户端断开，ID={client.ID}");
            base.OnDisconnected(client, e);
        }
    }
}
